package com.zpark.se.system;

import java.io.Console;
import java.io.InputStream;
import java.io.PrintStream;
import java.util.Enumeration;
import java.util.Properties;

/**
 * System类->系统类
 *      System 类位于 java.lang 包，代表当前 Java 程序的运行平台，系统级的很多属性
 * 和控制方法都放置在该类的内部。由于该类的构造方法是 private 的，所以无法创建该类的对象，
 * 也就是无法实例化该类。
 *		System 类提供了一些类变量和类方法，允许直接通过 System 类来调用这些类变量和类方法。
 */
public class Demo01 {
    public static void main(String[] args) {
        // system类的属性（静态变量）
        // System.out.println();
        PrintStream out = System.out; // 获取系统标准输出流对象
        System.out.println("获取系统输出流对象: System.out");
        PrintStream err = System.err; // 获取系统标准错误输出流
        System.err.println("获取系统错误输出流: System.err");

        InputStream in = System.in; // 获取系统标准输入流对象

        /*
            System类常用方法（静态方法）
         */
        // System.arraycopy(); 数组复制方法
        // System.clearProperty(key) 清除指定key值的系统属性
        /*
            返回与当前Java虚拟机关联的唯一控制台对象（如果有的话）。
         */
        Console console = System.console();
        /*
            获取当前系统时间戳（毫秒值）
         */
        long millis = System.currentTimeMillis();
        /*
            终止当前运行的Java虚拟机。参数用作状态码；按照惯例，非零状态码表示异常终止。
            此方法调用类Runtime中的退出方法。此方法永远不会正常返回。
            注意：在该语句之后的所有代码将不会被执行
            问：System.exit(int status)和return语句的区别？
            答：System.exit(int status)语句是结束虚拟机运行，语句后运行写代码
                return语句是结束方法的运行并且返回方法的执行结果，语句之后不允许写代码
         */
        // System.exit(20);

        /*
            运行垃圾收集器。
            调用gc方法表明Java虚拟机花费精力回收未使用的对象，以便使它们当前占用的内存可以快速
            重用。当控制从方法调用返回时，Java虚拟机已经尽最大努力从所有丢弃的对象中回收空间。
            调用System.gc（）实际上相当于调用：
                 Runtime.getRuntime().gc()
         */
        System.gc();

        /*
            获取当前系统所有属性对象
            Properties：key-value  键值对
         */
        Properties properties = System.getProperties();
        // 获取所有属性的key值
        Enumeration<?> names = properties.propertyNames();
        // 循环判断是否存在下一个key
        while (names.hasMoreElements()) {
            // 获取key值
            String key = names.nextElement() + "";
            // 根据key获取对应的value
            String value = System.getProperty(key);
            //String value = properties.getProperty(key);
            System.out.println(key + " : " + value);
        }
    }
}
